use_module(library(random)).
%jugar
%mostrarTablero(T)
%estadoFinal(T)
%ataque(T0, T1, F, C)
%barco(Fi,Ci,dir,tam).
barco(0,1,h,1).
%barco(1,2,h,2).
barco(0,0,h,1).


%C columna, E elemento o caracter a dibujar, L lista dibujada.
dibujarFila(0,_,[]):- !.
dibujarFila(C,E,L):- C1 is C-1, 
		   dibujarFila(C1,E,X),
		   append(X,[E],L).

%F filas, C columnas, T tablero a retornar.
tableroInicial(0,_,[]):- !.
tableroInicial(F, C, T) :- dibujarFila(C,a,LF), 
			   F1 is F-1, 
   			   tableroInicial(F1,C,X), 
			   append(X,[LF],T).

%P posicion, [H|R] lista a examinar.
%esta funcion indica si en la posicion dada por P, hay o no agua.
tieneAgua(0,[H|R]) :- a=H, !.
tieneAgua(P,[H|R]) :- P1 is P-1, 
		      tieneAgua(P1,R).

%_[H|R] tablero, N numero de lista o fila a retornar, L lista o fila deseada.
%esta funcion obtiene la fila de un tablero especificada por N.
obtenerSublista([H|R], 0, L) :- L=H, !.
obtenerSublista([H|R], N, L) :- N1 is N-1,
			        obtenerSublista(R,N1,L).

%_[H|R] lista original, N numero de elementos, Lf lista final
%Esta funcion obtiene los primeros N elementos de la lista especificada por [H|R]. 
obtenerInicio(_,0,[]):- !.
obtenerInicio([H|R],N,Lf) :- 	X1 is N-1,
				obtenerInicio(R,X1,A),
				append([H],A,Lf).

%L lista original, N numero de elementos, Lf lista final
%Esta funcion obtiene los ultimos N elementos de la lista L. 
%Fume al estilo Novich
obtenerFin(L,N,Lf):- 	length(L,Tam),
			N > Tam,
			append([],[],Lf),!.
			
obtenerFin(L,N,Lf):-	length(L,Tam),
			N =< Tam,
			length(Lf,N), %se crea una lista de tam N, con cualquier cosa
			append(_,Lf,L),
			!. %Cuando se hace el append, necesariamente Lf va a tener los ultimos N elementos de la lista L.

%L lista inicial, P posicion, Edo o caracter a dibujar, Lf lista final.
%Esta funcion cambia en la lista L, especificamente en la posicion P, un caracter especificado por Edo.
cambiarEdo(L,P,Edo,Lf):-length(L,Tam), 
			obtenerInicio(L,P,A),
			append(A,[Edo],B),
			C1 is Tam-P-1,
			obtenerFin(L,C1,C),
			append(B,C,Lf).

mostrarTablero([]):-write(''),!.
mostrarTablero([H|R]):- mostrarElemento(H),nl,
			mostrarTablero(R).

mostrarElemento([]):- write(''),!.
mostrarElemento([H|R]):- write(H),
			 write(' '),
			 mostrarElemento(R).
%NO!
ataqueInicial(T0, T1, F, C):- 	N is F*C,
				random(1,N,X), %de posicion dentro de la lista
				random(1,F,Y), %de lista
				obtenerSublista(T0,Y,Sublist),
				not(tieneAgua(Sublist,X)),
				cambiarEdo(Sublist,X,Newsublist).

noHayAtaque([]) :- !.
noHayAtaque([H|R]) :- noHayAtaqueFila(H),
		    noHayAtaque(R).

noHayAtaqueFila([]) :- !.
noHayAtaqueFila([H|R]) :- H=a,
			noHayAtaqueFila(R).

ataque(T0,T1,F,C,X,Y):- noHayAtaque(T0),
			Y is random(F),
			X is random(C),
			hayBarco(X,Y),
			dibujarFila(C,a,Fila),
			cambiarEdo(Fila,X,g,Filacambiada),
			obtenerInicio(T0,Y,L1),
			append(L1,[Filacambiada],L2),
			length(L2,Tam),
			Aux is F-Tam,
			obtenerFin(T0,Aux,L3),
			append(L2,L3,T1).

hayBarco(X,Y) :- barco(X,Y,_,_),!. 
hayBarco(X,Y) :- not(barco(X,Y,h,_)),
hayBarco(X,Y) :- not(barco(X,Y,v,_)),		 


			
